package com.qfedu.og.util;

import com.qfedu.og.dto.GroupDto;
import com.qfedu.og.entity.Group;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

/**
 * @program: OnlyGroup
 * @description:
 * @author: Feri(邢朋辉)
 * @create: 2021-03-25 18:36
 */
public class RandomGroupUtil {
    //智能分组
    /**
     * 实现智能分组，分组规则：
     * 1.实现分组，姓名之间,隔开
     * 2.最后一组的人数，如果小于每组人数的一半，就不能单独成组
     * 3.每个人都需要有组
     * 4.随机选出一个组长*/
    public static List<Group> random(GroupDto dto){
        //切割所有的名字 ,--
        String[] names=dto.getPersons().replaceAll("，",",").split(",");
        //校验切割的结果
        if(names!=null && names.length>0) {
            //集合 记录所分的组
            List<Group> list = new ArrayList<>();
            //分多组
            Random random = new Random();
            //？
            if (names.length > dto.getNum() * 1.5) {
                //计算需要分几组 40 -9 4==4
                int gps = 0;
                if (names.length % dto.getNum() < dto.getNum()/2.0) {
                    gps = names.length / dto.getNum();
                } else {
                    gps = names.length / dto.getNum() + 1;
                }
                //将姓名的数组 变为集合
                List<String> nameList = new ArrayList<>(Arrays.asList(names));
                //循环随机为每组分配人员
                for (int i = 0; i < gps; i++) {
                    Group group = new Group();
                    group.setCid(dto.getCid());
                    group.setNo(i + 1);
                    group.setNum(dto.getNum());
                    //分配人员
                    StringBuffer buffer = new StringBuffer();
                    //对应的人就是组长
                    for (int j = 0; j < dto.getNum(); j++) {
                        //最后一组不一定是整除
                        if (nameList.size() <= 0) {
                            break;
                        }
                        int index = random.nextInt(nameList.size());
                        if (j == 0) {
                            //组长就是你
                            group.setGleader(nameList.remove(index));
                        } else {
                            //随机取一个名字 添加
                            buffer.append(nameList.remove(index) + ",");
                        }
                    }
                    //移除最后一位,
                    buffer.deleteCharAt(buffer.length() - 1);
                    group.setPersons(buffer.toString());
                    //最后一组，组的人数不一定是指定的人数 剩余的人数
                    if(i+1==gps){
                        group.setNum(names.length-(gps-1)*dto.getNum());
                    }else {
                        group.setNum(dto.getNum());
                    }
                    list.add(group);//添加到本次分组中
                }

                //多余的人还是
                if (nameList.size() > 0) {
                    for (int m = 0; m < nameList.size(); m++) {
                        //缺陷：每次多的人都是 从前往后排
                        Group group = list.get(m);
                        group.setPersons(group.getPersons() + "," + nameList.get(m));
                        group.setNum(dto.getNum() + 1);
                    }
                }
            }
            else {
                //就只有一组
                Group group = new Group();
                group.setCid(dto.getCid());
                group.setNo(1);
                group.setNum(names.length);
                //如果就一个人，那么本人就是组长
                if (names.length == 1) {
                    group.setGleader(names[0]);
                } else {
                    group.setGleader(names[random.nextInt(names.length)]);
                    //排除组长 剩下来的人拼接
                    StringBuffer buffer = new StringBuffer();
                    for (String s : names) {
                        if (!s.equals(group.getGleader())) {
                            buffer.append(s + ",");
                        }
                    }
                    buffer.deleteCharAt(buffer.length() - 1);
                    group.setPersons(buffer.toString());
                }
                list.add(group);
            }
            return list;
        }
        return null;
    }
}
